﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;


class Maker {
public:
	Maker(int id, int age) {
		this->id = id;
		this->age = age;
		score = 100;
	}
	// 常函数，在普通成员函数括号后面加上const，该成员函数就变为一个常函数
	// 常函数中不能修改普通成员变量，但可以修改mutable成员变量  
	// 普通成员函数中this的声明是：Maker * const this;
	// 常函数中this的声明是：const Maker * const this; 
	// 常函数原理：常函数后面的const不是修饰的函数，而是修饰的函数内部的this，即把默认的 Maker * const this 修改为 const Maker * const this 
	void printMaker() const {
		// id = 100;
		score = 80;
		// Maker::a = 10; // 类的static成员不能在类内部成员函数中修改 
	}

	void func() {
		cout << "func" << endl;
	}
public:
	int id;
	int age;
	mutable int score;
	static int a;
};

void test01() {
	// 1. 在数据类型前面加上const，让对象成为常对象 
	const Maker m(1, 18);
	// m.id = 100; // 常对象不能改变普通成员变量的值 
	// m.func();  // 常对象不能调用普通成员函数  
	m.printMaker();  // 常对象可以调用常函数  
	m.score = 90; // 常对象可以修改mutable成员变量 
}

int main()
{

	test01(); 

	system("pause");
	return EXIT_SUCCESS;
}